//
//  main.c
//  tree树-二叉链表
//
//  Created by Song on 2018/3/20.
//  Copyright © 2018年 Song. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BiNode {  // 结构体
    char data;
    struct BiNode *lchild,*rchild;
}BiNode, *BiTree; // 结构体指针

// 创建
void creatTree(BiTree *tP) {
    char ch;
    scanf("%c",&ch);
    if (ch == '#') {
        *tP = NULL;
    } else {
        *tP = (BiTree)malloc(sizeof(BiNode));
        if (!*tP) { exit(0); }
        (*tP)->data = ch;
        creatTree(&(*tP)->lchild);
        creatTree(&(*tP)->rchild);
    }
}

//// 创建
//BiNode* creatTree1() {
//    BiNode *t = (BiNode*)malloc(sizeof(BiNode));
//    char ch;
//    scanf("%c",&ch);
//    if (ch == '#') {
//        t = NULL;
//    } else {
////        t = (BiNode*)malloc(sizeof(BiNode));
//        if (!t) { exit(0); }
//        (t)->data = ch;
//        t->lchild = creatTree1();
//        t->rchild = creatTree1();
//    }
//    return t;
//}

// 前序遍历
void PreOrderTraverse(BiNode *T) {
    if (T == NULL) {
        return;
    }
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
// 中序遍历
void InOrderTraverse(BiNode *T) {
    if (T == NULL) {
        return;
    }
    
    InOrderTraverse(T->lchild);
    printf("%c ",T->data);
    InOrderTraverse(T->rchild);
}
// 后序遍历
void PostOrderTraverse(BiNode *T) {
    if (T == NULL) {
        return;
    }
    
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}


// 指针训练
void change1(int *t) {
    int i = (int)malloc(sizeof(int));
    i = 2;
    *t = i; // t 还是指向全局的 i 的地址，然后将全局的 i 由 i=1 改成 i=2
}

void change2(int *t) {
    int i = (int)malloc(sizeof(int));
    i = 2;
    t = &i; // 改变了 t 指向的地址，t 指向了局部的 i=2,但是 q 与全局的 i 没变
}


int main(int argc, const char * argv[]) {
    
    int  i = 1;
    int *p = &i;
    printf("before  %d\n", *p); // 1
    change1(p);
    printf("after %d\n",*p); // 2
    
    int  j = 1;
    int *q = &j;
    printf("before  %d\n", *q); // 1
    change2(q);
    printf("after %d\n",*q); // 1
    
    
    
    
    
    printf("\n输入：");

    BiNode *t; // 对应上方注释掉的函数 一起使用
    creatTree(&t);

//    BiNode *t = creatTree1();
    
    PreOrderTraverse(t); // 前
    printf("\n");
    InOrderTraverse(t); // 中
    printf("\n");
    PostOrderTraverse(t); // 后
    printf("\n");

    
    
    return 0;
}
